#pragma once

//对信号量的封装
//信号量本质上就是计数器，使用资源的局部就会用到信号量；每个线程进入临界区，计数器做--，出临界区计数器++,所对应的就是P操作与V操作
//申请信号量的本质就是对资源的预定机制，在访问临界资源的时候必须先申请信号量，进行P操作，P操作成功就意味着预定资源成功
//而P操作失败就意味着失败，当前线程就会在信号量出阻塞；PV操作必须是原子的
//sem_init  sem_destroy sem_wait ->P操作 sem_post --> V操作

#include<iostream>
#include<semaphore.h>
#include<unistd.h>

class Sem
{
public:
    Sem(int num):_initnum(num)
    {
        //初始化信号量
        sem_init(&_sem , 0 , _initnum);
    }
    void P()
    {
        sem_wait(&_sem);
    }
    void V()
    {
        sem_post(&_sem);
    }
    ~Sem()
    {
        sem_destroy(&_sem);
    }
private:
    sem_t _sem;
    int _initnum;
};
